Skip to content

Conversation

@nnethercote
Copy link
Contributor

freshen_{ty,const} take a Result and just do a fold if the input is Ok. It's simpler to do those folds at the call site, and only call freshen_{ty,const} in the Err case. That way we can also avoid useless fold operations on the results of new_{int,uint,float}.

Also, make some bug! calls more concise.

r? @lcnr

`freshen_{ty,const}` take a `Result` and just do a fold if the input is
`Ok`. It's simpler to do those folds at the call site, and only call
`freshen_{ty,const}` in the `Err` case. That way we can also avoid
useless fold operations on the results of `new_{int,uint,float}`.

Also, make some `bug!` calls more concise.
@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Dec 22, 2025
I have always found this confusingly named, because it creates a new
freshener rather than returning an existing one. We can remove it and
just use `TypeFreshener::new()` at the two call sites, avoiding this
confusion.
Copy link
Contributor

@lcnr lcnr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

r=me, but would love for u to look into a related refactor

View changes since this review

Sometimes we freshen using a new `TypeFreshener`, and sometimes we
freshen with an existing `TypeFreshener`. For the former we have the
method `InferCtxt::freshen`. For the latter we just call `fold_with`.
This asymmetry has been confusing to me.

This commit removes `InferCtxt::freshen` so that all the freshening
sites consistently use `fold_with` and it's obvious if each one is using
a new or existing `TypeFreshener`.
Because `fresh_trait_pred` is the name of the field/argument. The `_ref`
suffix appears to be a typo, or left over from earlier versions of the
code.
@nnethercote nnethercote force-pushed the simplify-TypeFreshener-methods branch from 0d4649d to 2d10f47 Compare December 22, 2025 12:47
#[inline(never)]
fn fold_infer_ty(&mut self, v: ty::InferTy) -> Option<Ty<'tcx>> {
match v {
fn fold_infer_ty(&mut self, ty: ty::InferTy) -> Option<Ty<'tcx>> {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

now always returns Some?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes! I have added a commit to remove the Option.

@nnethercote
Copy link
Contributor Author

Thanks for the suggestions, this has ended up much nicer than the first version.

@lcnr
Copy link
Contributor

lcnr commented Dec 23, 2025

@bors try @rust-timer queue

freshening should be at least somewhat hot?

@rust-timer

This comment has been minimized.

@rust-bors

This comment has been minimized.

rust-bors bot added a commit that referenced this pull request Dec 23, 2025
…=<try>

Simplify `TypeFreshener` methods.
@rustbot rustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Dec 23, 2025
@nnethercote
Copy link
Contributor Author

Freshening is definitely hot, but freshening of inference variables is much less so. Local measurements indicated that the perf effects were negligible, but it doesn't hurt to double check.

@rust-bors
Copy link

rust-bors bot commented Dec 23, 2025

💥 Test timed out after 21600s

@lcnr
Copy link
Contributor

lcnr commented Dec 23, 2025

@bors try

@rust-bors

This comment has been minimized.

rust-bors bot added a commit that referenced this pull request Dec 23, 2025
…=<try>

Simplify `TypeFreshener` methods.
@rust-bors
Copy link

rust-bors bot commented Dec 23, 2025

☀️ Try build successful (CI)
Build commit: d1d7c44 (d1d7c443a2cb57b25b43cf0031489c133be86cff, parent: 99ff3fbb86658b427f5dd7daaae8db5626a63c26)

@rust-timer

This comment has been minimized.

@rust-timer
Copy link
Collaborator

Finished benchmarking commit (d1d7c44): comparison URL.

Overall result: no relevant changes - no action needed

Benchmarking this pull request means it may be perf-sensitive – we'll automatically label it not fit for rolling up. You can override this, but we strongly advise not to, due to possible changes in compiler perf.

@bors rollup=never
@rustbot label: -S-waiting-on-perf -perf-regression

Instruction count

This benchmark run did not return any relevant results for this metric.

Max RSS (memory usage)

This benchmark run did not return any relevant results for this metric.

Cycles

Results (primary 2.1%, secondary 2.1%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

mean range count
Regressions ❌
(primary)
2.1% [1.7%, 2.6%] 4
Regressions ❌
(secondary)
2.1% [2.1%, 2.1%] 1
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
- - 0
All ❌✅ (primary) 2.1% [1.7%, 2.6%] 4

Binary size

This benchmark run did not return any relevant results for this metric.

Bootstrap: 482.582s -> 480.862s (-0.36%)
Artifact size: 390.35 MiB -> 390.37 MiB (0.00%)

@rustbot rustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Dec 23, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants